home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 June
/
EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso
/
earcd
/
utilsys
/
rss14gmd.lha
/
RSys_1.4gmd
/
C
/
Broker.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-05-04
|
6KB
|
300 lines
/*
***************************************************************************
*
* Datei:
* RSysBroker.c
*
* Inhalt:
*
* --- Globale Routinen ---
*
* void HandleBrokerPort ( void );
* void InstallBroker ( void );
* void RemoveBroker ( void );
*
* --- Lokale Routinen ---
*
* static void HandleBrokerInputEventMsg ( ULONG msgid );
* static void HandleExchangeMsg ( ULONG msgid );
* static void InstallHotKeys ( void );
*
* Bemerkungen:
* Broker-Verwaltungsroutinen unter Verwendung der Commodities-Library.
*
* Erstellungsdatum:
* 07-Jul-93 Rolf Böhme
*
* Änderungen:
* 07-Jul-93 Rolf Böhme Erstellung
*
***************************************************************************
*/
#include "RSys.h"
#include "protos.h"
/*
* Die Prozedur InstallHotKeys() bildet für alle zu
* installierenden HotKeys einen Filter und bindet
* diese dann in die Broker-Struktur ein.
*/
static void
InstallHotKeys (void)
{
int i;
for (i = 0; i < HOTKEYS + 1; i++)
{
filter[i] = HotKey ((UBYTE *) & hotkey[i][0], broker_mp,
(long) (i + 1));
/*
* Falls kein Filter erzeugt werden konnte, wird eine
* Fehlermeldung ausgegeben und das Programm beendet.
*/
if (NOT (filter[i]))
{
printf ("i = %d\n", i);
ErrorHandle ((char *) hotkey[i][0], BROKER_ERR, CREATE_FAIL, KILL);
}
AttachCxObj (broker, filter[i]);
}
return;
}
/*
* InstallBroker() öffnet die commodities.library,
* richtet einen MessagePort für die Nachrichten vom
* Broker ein, initialisiert ein Broker-
* Kontrollstruktur und startet den Broker.
*/
void
InstallBroker (void)
{
// return; /*GMD */
DPOS;
/*
* Ein Kommunikations-Port wird erzeugt.
*/
if (broker_mp = CreatePort ((UBYTE *) "RSys-Broker-Port", 0L))
{
newbroker.nb_Port = broker_mp;
newbroker.nb_Pri = 0;
/*
* Falls der Broker erzeugt werden konnte, werden die
* HotKeys installiert und der Broker gestartet.
*/
if (broker = CxBroker (&newbroker, NULL))
InstallHotKeys ();
else
ErrorHandle (newbroker.nb_Name, BROKER_ERR, CREATE_FAIL, KILL);
ActivateCxObj (broker, TRUE);
}
else
ErrorHandle ("RSys-Broker-Port", PORT_ERR, CREATE_FAIL, KILL);
return;
}
/*
* RemoveBroker() entfernt alle mit dem Broker
* verbundenen Datenstrukturen aus dem System und
* schließt die commodities.library.
*/
void
RemoveBroker (void)
{
DPOS;
if (broker)
DeleteCxObjAll (broker);
if (broker_mp)
DeletePort (broker_mp);
return;
}
static void
HandleBrokerInputEventMsg (ULONG msgid)
{
SCREEN *FindFrontPubScr (SCREEN *);
SCREEN *activescr;
/*
* Dieses Feld von Funktionenzeigern enthält alle
* Funktionen, die entsprechend der MessageID
* ausgeführt werden.
*/
void (*func[HOTKEYS]) (void) =
{CryptFile,
FindFile,
FormatDisk,
HunkStruct,
CRCSum,
SaveWindows,
DisplayFileRequest};
int openit;
/*
* Ist die MessageID 1, soll das RSys-Hauptfenster
* erscheinen.
*/
if (msgid == 1)
{
/*
* Falls das Hauptfenster bereits offen ist, wird der
* nächst Public screen gesucht und versucht, RSys auf
* diesem Screen zu öffnen. War das erfolgreich, wird
* das ListView des Hauptfensters aktualisiert.
*/
if (SysWnd)
{
activescr = SysWnd->WScreen;
if (activescr != FindFrontPubScr (activescr))
{
CloseASysWindow (&SysWnd, &SysGList, &SysMenus);
CloseDownScreen ();
OpenMainWindow ();
RefreshList (LastID);
openit = CloseHelpOnScreen ();
OpenHelpOnScreen (openit);
}
}
else
{
/*
* Ist das Hauptfenster noch nicht geöffnet, wird es
* mit der Standardprozedur geöffnet und das ListView
* aktualisiert.
*/
OpenMainWindow ();
RefreshList (LastID);
openit = CloseHelpOnScreen ();
OpenHelpOnScreen (openit);
}
}
else
{
/*
* Ist die MessageID größer als 1, werden die
* entsprechenden Funktionen aus dem
* Funktionenzeigerfeld ausgeführt. Ist das
* Hauptfenster noch nicht geöffnet worden, muß der
* Screen, auf dem das Fenster der jeweiligen
* Funktion geöffnet werden soll, mit SetupScreen()
* vorbereitet werden.
*/
if (NOT (SysWnd))
if (SetupScreen ())
ErrorHandle ((char *) namebuffer, SCREEN_ERR, INFO_FAIL, NO_KILL);
(*func[msgid - 2]) ();
if (NOT (SysWnd))
CloseDownScreen ();
}
return;
}
static void
HandleExchangeMsg (ULONG msgid)
{
switch (msgid)
{
/*
* Der Broker von RSys soll ausgeschaltet werden.
*/
case CXCMD_DISABLE:
ActivateCxObj (broker, 0L);
break;
/*
* Der Broker von RSys soll eingeschaltet werden.
*/
case CXCMD_ENABLE:
ActivateCxObj (broker, 1L);
break;
/*
* RSys soll ohne Sicherheitsabfrage beendet werden.
*/
case CXCMD_KILL:
quit (FALSE);
break;
case CXCMD_UNIQUE:
/*
* Ein Programm versucht einen Broker mit dem Namen
* RSys einzurichten. Es erscheint eine Fehlermeldung.
*/
ErrorHandle (newbroker.nb_Name, BROKER_ERR, DUPLICATE_FAIL, NO_KILL);
break;
}
return;
}
/*
* HandleBrokerPort() verarbeitet alle Nachrichten,
* die am Broker port eintreffen.
*/
void
HandleBrokerPort (void)
{
CxMsg *msg;
ULONG msgid, msgtype;
DPOS;
/*
* Alle Messages, die am Brokerport anliegen, werden
* bearbeitet.
*/
while (msg = (CxMsg *) GetMsg (broker_mp))
{
/*
* Aus der Message werden die notwendigen Daten
* herauskopiert. Danach wird die Nachricht wieder
* so schnell wie möglich beantwortet, damit der
* Broker nicht wartet.
*/
msgid = CxMsgID (msg);
msgtype = CxMsgType (msg);
ReplyMsg ((MESSAGE *) msg);
/*
* Entsprechend dem Typ der Nachricht werden
* verschiedene Aktionen ausgelöst.
*/
switch (msgtype)
{
/*
* Es handelt sich um einen Inputevent.
*/
case CXM_IEVENT:
HandleBrokerInputEventMsg (msgid);
break;
/*
* Es ist eine Nachricht vom Programm Exchange.
*/
case CXM_COMMAND:
HandleExchangeMsg (msgid);
break;
}
}
return;
}